home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Medal Software 2
/
Gold Medal Software Volume 2 (Gold Medal) (1994).iso
/
prog
/
adlip.arj
/
CMICRO.MAC
< prev
next >
Wrap
Text File
|
1987-11-27
|
3KB
|
178 lines
.XLIST
PAGE 58,132
; File that supports LATTICE macros But generates Microsoft C
; segments or variables memX variable is declared in version.inc
IFDEF memS
LDATA EQU 0
LPROG EQU 0
ENDIF
IFDEF memM
LDATA EQU 0
LPROG EQU 1
ENDIF
IFDEF memC
LDATA EQU 1
LPROG EQU 0
ENDIF
IFDEF memL
LDATA EQU 1
LPROG EQU 1
ENDIF
IFDEF memH
LDATA EQU 1
LPROG EQU 1
ENDIF
;**
;
; The following symbols are established via LPROG and LDATA as follows:
;
; S8086 set for small model (small prog, small data)
; D8086 set for model with large data, small prog
; P8086 set for model with large prog, small data
; L8086 set for large model
;
;**
IF (LPROG EQ 0) AND (LDATA EQ 0)
S8086 EQU 1
D8086 EQU 0
P8086 EQU 0
L8086 EQU 0
ENDIF
IF (LPROG EQ 0) AND (LDATA NE 0)
S8086 EQU 0
D8086 EQU 1
P8086 EQU 0
L8086 EQU 0
ENDIF
IF (LPROG NE 0) AND (LDATA EQ 0)
S8086 EQU 0
D8086 EQU 0
P8086 EQU 1
L8086 EQU 0
ENDIF
IF (LPROG NE 0) AND (LDATA NE 0)
S8086 EQU 0
D8086 EQU 0
P8086 EQU 0
L8086 EQU 1
ENDIF
;**
;
; The DSEG and PSEG macros are defined to generate the appropriate GROUP
; and SEGMENT statements for the memory model being used. The ENDDS and
; ENDPS macros are then used to end the segments.
;
;**
DSEG MACRO
DGROUP GROUP _DATA
_DATA SEGMENT WORD PUBLIC 'DATA'
ASSUME DS:DGROUP, SS:DGROUP
ENDM
ENDDS MACRO
_DATA ENDS
ENDM
PSEG MACRO modname
IF LPROG
modname&_TEXT SEGMENT WORD PUBLIC 'CODE'
ASSUME CS:modname&_TEXT
ELSE
_TEXT SEGMENT WORD PUBLIC 'CODE'
ASSUME CS:_TEXT
ENDIF
ENDM
ENDPS MACRO modname
IF LPROG
modname&_TEXT ENDS
ELSE
_TEXT ENDS
ENDIF
ENDM
;**
;
; The BEGIN and ENTRY macros establish appropriate function entry points
; depending on whether NEAR or FAR program addressing is being used. The
; only difference between the two is that BEGIN generates a PROC operation
; to start a segment.
;
BEGIN MACRO NAME ; begin a function
PUBLIC NAME
IF LPROG
NAME PROC FAR
ELSE
NAME PROC NEAR
ENDIF
ENDM
ENTRY MACRO NAME
PUBLIC NAME
IF LPROG
NAME LABEL FAR
ELSE
NAME LABEL NEAR
ENDIF
ENDM
;**
;
; The following symbols are defined to help set up a STRUC defining the
; stack frame:
;
; CPSIZE -> code pointer size (2 or 4)
; DPSIZE -> data pointer size (2 or 4)
;
; These wouldn't be necessary if it were possible to use macros or even
; conditionals within a STRUC.
;
IF LPROG
CPSIZE EQU 4
ELSE
CPSIZE EQU 2
ENDIF
IF LDATA
DPSIZE EQU 4
ELSE
DPSIZE EQU 2
ENDIF
penter MACRO dyns ; used when we enter a procedure
push BP ; save context register
IF dyns NE 0
sub SP, dyns ; local variables on stack
ENDIF
mov BP, SP ;
push DI ; for register variables (MICROSOFT 'C' 3.0)
push SI ;
ENDM ;
pleave MACRO dyns ; used when we leave a procedure
pop SI ;
pop DI ;
IF dyns NE 0
add SP, dyns ;
ENDIF
pop BP ;
ret ;
ENDM ;
.LIST